using Godot;
using Smr;
using Smr.基类;
using System;
using System.Reflection;

public partial class 角色属性 : PanelContainer
{
    [Export] private 组件进度条 进度条;
    [Export] private Label[] 显示标签;
    [Export] private VBoxContainer 垂直容器左;
    [Export] private VBoxContainer 垂直容器右;

    public override void _Ready()
    {
        进度条.置最大值(游戏管理.玩家实例.取当前职级经验上限());
        游戏管理.玩家实例.信号经验被改变 += 置当前经验;
    }

    public override void _ExitTree()
    {
        游戏管理.玩家实例.信号经验被改变 -= 置当前经验;
    }

    private void 初始化()
    {
        显示标签[0].Text = "名称：" + 游戏存档.玩家.基础属性.名称;
        显示标签[1].Text = "称谓：" + 游戏存档.玩家.基础属性.称谓 + " · " + 游戏存档.玩家.基础属性.职级;
        显示标签[2].Text = "毅力：" + 游戏存档.玩家.基础属性.毅力;

        进度条.置当前值(游戏存档.玩家.基础属性.当前职级经验);

        foreach (var 项目 in 垂直容器左.GetChildren())
        {
            项目.QueueFree();
        }
        foreach (var 项目 in 垂直容器右.GetChildren())
        {
            项目.QueueFree();
        }

        C角色模型 玩家 = 游戏存档.玩家.取综合属性(游戏管理.装备栏实例.取装备栏战斗属性());
        Type 类型 = 玩家.战斗属性.GetType();
        PropertyInfo[] 属性元数据 = 类型.GetProperties();
        for (int i = 0; i < 属性元数据.Length; i++)
        {
            // 跳过所有属性和伤害
            if (i < 5)
            {
                continue;
            }
            if (i % 2 == 0)
            {
                PropertyInfo 属性一 = 属性元数据[i];
                PropertyInfo 属性二 = 属性元数据[i + 1];
                生成战斗属性(属性一.Name, (float)属性一.GetValue(玩家.战斗属性), 属性二.Name, (float)属性二.GetValue(玩家.战斗属性));
            }
        }
    }

    private void 生成战斗属性(string 属性名一, float 属性值一, string 属性名二, float 属性值二)
    {
        HBoxContainer 水平容器左 = new();
        HBoxContainer 水平容器右 = new();

        Label 属性名一标签 = new()
        {
            Text = 属性名一 + ": "
        };
        Label 属性值一标签 = new()
        {
            Text = ((int)属性值一).ToString() + (属性名一.Contains('率') ? "%" : "")
        };

        水平容器左.AddChild(属性名一标签);
        水平容器左.AddChild(属性值一标签);

        Label 属性名二标签 = new()
        {
            Text = 属性名二 + ": "
        };
        Label 属性值二标签 = new()
        {
            Text = ((int)属性值二).ToString() + (属性名二.Contains('率') ? "%" : "")
        };

        水平容器右.AddChild(属性名二标签);
        水平容器右.AddChild(属性值二标签);

        垂直容器左.AddChild(水平容器左);
        垂直容器右.AddChild(水平容器右);
    }

    private void 置当前经验()
    {
        显示标签[1].Text = "称谓：" + 游戏存档.玩家.基础属性.称谓 + " · " + 游戏存档.玩家.基础属性.职级;
        进度条.置最大值(游戏管理.玩家实例.取当前职级经验上限());
        进度条.置当前值(游戏存档.玩家.基础属性.当前职级经验);
    }
}
